package com.sinosoft.brokerchannel.base.utile;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.URIException;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;
import org.apache.commons.httpclient.util.URIUtil;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;

/**
 * HTTP工具类
 *
 * @author happyqing 2015-4-20
 */
public final class HttpclientUtil {
    private static Log log = LogFactory.getLog(HttpclientUtil.class);

    /**
     * 执行一个HTTP GET请求，返回请求响应的HTML
     *
     * @param url         请求的URL地址
     * @param queryString 请求的查询参数,可以为null
     * @param charset     字符集
     * @param pretty      是否美化
     * @return 返回请求响应的HTML
     */
    public static String doGet(String url, String queryString, String charset, boolean pretty) {
        StringBuffer response = new StringBuffer();
        HttpClient client = new HttpClient();
        HttpMethod method = new GetMethod(url);
        try {
            if (StringUtils.isNotBlank(queryString))
                //对get请求参数做了http请求默认编码，好像没有任何问题，汉字编码后，就成为%式样的字符串
                method.setQueryString(URIUtil.encodeQuery(queryString));
            client.executeMethod(method);
            if (method.getStatusCode() == HttpStatus.SC_OK) {
                BufferedReader reader = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream(), charset));
                String line;
                while ((line = reader.readLine()) != null) {
                    if (pretty)
                        response.append(line).append(System.getProperty("line.separator"));
                    else
                        response.append(line);
                }
                reader.close();
            }
        } catch (URIException e) {
            log.error("执行HTTP Get请求时，编码查询字符串“" + queryString + "”发生异常！", e);
        } catch (IOException e) {
            log.error("执行HTTP Get请求" + url + "时，发生异常！", e);
        } finally {
            method.releaseConnection();
        }
        return response.toString();
    }

    /**
     * 执行一个HTTP POST请求，返回请求响应的HTML
     *
     * @param url     请求的URL地址
     * @param params  请求的查询参数,可以为null
     * @param charset 字符集
     * @param pretty  是否美化
     * @return 返回请求响应的HTML
     */
    public static String doPost(String url, Map<String, String> params, String charset, boolean pretty) {
        StringBuffer response = new StringBuffer();
        HttpClient client = new HttpClient();
        PostMethod method = new PostMethod(url);
        //设置参数的字符集
        method.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, charset);
        //设置Http Post数据
        if (params != null) {
            //HttpMethodParams p = new HttpMethodParams();
            for (Map.Entry<String, String> entry : params.entrySet()) {
                //p.setParameter(entry.getKey(), entry.getValue());
                method.setParameter(entry.getKey(), entry.getValue());
            }
            //method.setParams(p);
        }
        try {
            client.executeMethod(method);
            if (method.getStatusCode() == HttpStatus.SC_OK) {
                BufferedReader reader = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream(), charset));
                String line;
                while ((line = reader.readLine()) != null) {
                    if (pretty)
                        response.append(line).append(System.getProperty("line.separator"));
                    else
                        response.append(line);
                }
                reader.close();
            }
        } catch (IOException e) {
            log.error("执行HTTP Post请求" + url + "时，发生异常！", e);
        } finally {
            method.releaseConnection();
        }
        return response.toString();
    }
    /**
     * 执行一个HTTP POST请求，返回请求响应的HTML
     *
     * @param url     请求的URL地址
     * @param params  请求的查询参数,可以为null
     * @param charset 字符集
     * @param pretty  是否美化
     * @return 返回请求响应的HTML
     */
    public static String doPostToken(String url, Map<String, String> params, String charset, boolean pretty, String token) {
        StringBuffer response = new StringBuffer();
        HttpClient client = new HttpClient();
        PostMethod method = new PostMethod(url);
        //设置参数的字符集
        method.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, charset);
        method.setRequestHeader("token",token);
        //设置Http Post数据
        if (params != null) {
            //HttpMethodParams p = new HttpMethodParams();
            for (Map.Entry<String, String> entry : params.entrySet()) {
                //p.setParameter(entry.getKey(), entry.getValue());
                method.setParameter(entry.getKey(), entry.getValue());
            }
            //method.setParams(p);
        }
        try {
            client.executeMethod(method);
            if (method.getStatusCode() == HttpStatus.SC_OK) {
                BufferedReader reader = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream(), charset));
                String line;
                while ((line = reader.readLine()) != null) {
                    if (pretty)
                        response.append(line).append(System.getProperty("line.separator"));
                    else
                        response.append(line);
                }
                reader.close();
            }
        } catch (IOException e) {
            log.error("执行HTTP Post请求" + url + "时，发生异常！", e);
        } finally {
            method.releaseConnection();
        }
        return response.toString();
    }
    public static void main(String[] args) {

        String str = null;

        try {
            str = URLEncoder.encode("大熊", "UTF-8");
        } catch (Exception e) {
        }
//        String y = doGet("http://127.0.0.1:10002/client/list/dymicSql?pageName=test-fpc&formName=test-fpc&userKeys=portal-v1.0", null, "UTF-8", true);
//        System.out.println("-------------"+y);

//        String paramData="{'pageName':'test-tt','formName':'editForm','testTt.w_infoId':'123','testTt.orgId':'asd','userKeys':'portal-v1.0'}";
        Map<String,String> map = new HashMap<>();
        map.put("pageName","gp-settlet-fee");
        map.put("formName","editForm");
        map.put("gpSettletFee.w_settleNo","CS001AXCX00000220180706001");
        map.put("gpSettletFee.settleAmount","2");
        map.put("userKeys","portal-v1.0");
        map.put("doCode","doService");
        String strs = doPost("http://127.0.0.1:10002/client/service/",map,"utf-8",true);
        System.out.println(strs);

        /*try {
            JSONObject jsonObject = JSONObject.fromObject(y);
            JSONArray jsonArray = jsonObject.getJSONArray("rows");
            for (int i = 0; i < jsonArray.size(); i++) {
                JSONObject JO = jsonArray.getJSONObject(i);
                JSONArray future = JSONArray.fromObject(JO.get("uctOrg"));
                JSONArray future1 = JSONArray.fromObject(JO.get("uctUser"));
                for (int j = 0; j < future.size(); j++) {
                    JSONObject JO0 = future.getJSONObject(j);
                    String a = JO0.getString("orgCname");
                    String b = JO0.getString("orgEname");
                    System.out.println(a + "空格" + b);
                }
                System.out.println(future1.get(0));
                for (int n = 0; n < future1.size(); n++) {
                    JSONObject JO1 = future1.getJSONObject(n);
                    String a = JO1.getString("userEname");
                    String b = JO1.getString("userCname");
                    System.out.println(a + "空格" + b);
                }
            }
        } catch (Exception e) {

        }*/
    }
    private String urlEncoder(String str, String charset) throws UnsupportedEncodingException {
        String result = URLEncoder.encode(str, charset);
        return result;
    }


//              Map params = new HashMap();
//              params.put("param1", "value1");
//              params.put("json", "{\"aa\":\"11\"}");
//                String j = doPost("http://localhost/uplat/manage/test.do?reqCode=add", params, "UTF-8", true);
//                System.out.println(j);
}

